package commons.params.param_component;

import commons.Constants;
import commons.data.category.Category;
import commons.data.category.Filter;
import commons.params.A_ParamsManager;
import commons.utils.Utils;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JComponent;


public class ParamComponent_table_Categorie extends AbstractParamComponent_table {


	public ParamComponent_table_Categorie(String name, A_ParamsManager paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom catégorie", "Basée sur", "Champ", "Pattern"},
				new String[] {"nomCategorie", "categorieBase", "champFiltre", "pattern"},
				new Class[] {String.class, String.class, String.class, String.class});
	}

	// Renvoit la liste des nom de catégories entrées par l'utilisateur
	public ArrayList<String> getListNomCategories() {
		return getListValue(0);
	}

	// ajout, en premiere possibilité, de la catégorie spéciale  - AllData -
	public ArrayList<String> getListNomCategories_plusCategorieAllData() {
		ArrayList<String> vRes = getListNomCategories();
		vRes.add(0,Constants.CATEGORY_ALLDATA_NAME);
		return vRes;
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	public ArrayList<Category> getVCategory() {
		ArrayList<Category> vCategory = new ArrayList<Category>();
		// Petite map pour stocker les category deja lue, afin de les recupérer
		//  pour renseigner le champs 'Category.categoryBase'
		HashMap<String,Category> mapCategory = new HashMap<String,Category>();

		// On commence par ajouter la categorie par defaut ALL DATA
		mapCategory.put(Constants.CATEGORY_ALLDATA_NAME, Category.categoryAllData);
		vCategory.add(Category.categoryAllData);

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);
			Category cat = new Category();
			cat.name = (String) rowData[0];
			cat.categoryBase = mapCategory.get((String) rowData[1]);
			cat.filter = new Filter((String) rowData[2], (String) rowData[3]);

			vCategory.add(cat);
			mapCategory.put(cat.name, cat);
		}
		return vCategory;
	}

	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des catégories", true);
			return;
		}

		beginControls();

		// Parcourt des row
		Object[] rowData;
		int numCol;
		ArrayList<String> listNomCat = getListNomCategories();

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			rowData = data.get(numRow);

			//***** Nom de la catégorie ****************************************
			numCol = 0;
			String nomCat = (String) rowData[numCol];

			if (basicCheck_NoDoublon(numRow, numCol)) {

				// le nom de catégorie ne doit pas valoir CATEGORY_ALLDATA
				if (nomCat.equals(Constants.CATEGORY_ALLDATA_NAME))
					addError(numRow, numCol, "Nom de catégorie incorrect");
			}

			//***** Nom de la catégorie de base ********************************
			numCol = 1;
			String nomCatBase = (String) rowData[numCol];

			if (basicCheck(numRow, numCol)) {
				// La catégorie de base doit référencer soit CATEGORY_ALLDATA soit une cétégorie citée au dessus
				int index = listNomCat.indexOf(nomCatBase);
				if ((index==-1 || index >= numRow) && !nomCatBase.equals(Constants.CATEGORY_ALLDATA_NAME))
					addError(numRow, numCol, "La catégorie de base doit être un nom de catégorie déclaré plus haut dans le tableau");
			}

			//***** Champ du filtre ********************************************
			numCol = 2;
			basicCheck(numRow, numCol);

			//***** Pattern du filtre ******************************************
			numCol = 3;
			String pattern = (String) rowData[numCol];

			// le pattern est obligatoire
			if (basicCheck(numRow, numCol))
				// le pattern doit être valide
				if (!Utils.isValidePattern(pattern))
					addError(numRow, numCol, "Le pattern est invalide");
		}
		finaliseControls();
	}


}